package com.ilikesoup.instant.enums.loader;

import com.ilikesoup.instant.enums.basic.SelectEnum;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;

/**
 * 支持手动注册枚举下拉
 * 1 用于将没有实现 SelectEnum 的下拉枚举注册为下拉列表
 * 2 支持自定义固定下拉列表，不用局限于枚举
 *
 * @author Soup
 */
public class GenericEnumSelectLoader implements SelectLoader {

    /**
     *  下拉注册表
     */
    private final Map<String, List<SelectEnum.SelectVo>> selectRegister = new ConcurrentHashMap<>();

    @Override
    public List<SelectEnum.SelectVo> load(String key) {
        return selectRegister.getOrDefault(key, Collections.emptyList());
    }

    /**
     * 能够支持通用的枚举
     *
     * @param key           下拉框的key
     * @param enumClass     枚举类
     * @param codeGetter    枚举中获取code的方法
     * @param descGetter    枚举中获取desc的方法
     * @param <T>           枚举类型
     * @param <K>           code类型
     * @return  this
     */
    public <T extends Enum<T>, K> GenericEnumSelectLoader register(String key, Class<T> enumClass, Function<T, K> codeGetter, Function<T, String> descGetter) {
        selectRegister.compute(key, (k,v) -> Collections.unmodifiableList(SelectEnum.list(enumClass, codeGetter, descGetter)));
        return this;
    }

    /**
     * 注册下拉列表
     *
     * @param key           下拉框的key
     * @param selectList    调用方法后，该参数的变化不再影响到下拉列表
     * @return  this
     */
    public GenericEnumSelectLoader register(String key, List<SelectEnum.SelectVo> selectList) {
        selectRegister.compute(key, (k,v) -> Collections.unmodifiableList(new ArrayList<>(selectList)));
        return this;
    }

}
